#ifndef GAMESESSION_H
#define GAMESESSION_H

#include <QMap>
#include <QDebug>
#include <QTimer>
#include <QVector>
#include <QJsonObject>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrlQuery>
#include <QJsonArray>
#include <QJsonDocument>
#include <QFile>
#include <QTextStream>
#include <QDateTime>
#include <QRegularExpression>
#include <QNetworkProxy>

#include "server.h"
#include "config.h"
#include "entities.h"

class GameSession: public QObject
{
    Q_OBJECT

public:
    GameSession();
    ~GameSession();

    void clear_users();
    void join_users(const QString &user_nickname, const QString& user_id);
    QString find_users(const int &index);
    int get_users_count();
    void change_game_switch(const bool& is_stop);
    QString get_user_name(const QString& user_id);
    void on_show_win(const QString& playerId, const QString& team, const QString& content);
    void on_show_gift(const QString& playerId, const QString& team, const QString& content);
    QString get_user_avatar(QString playerId);
    void clearUI();
    void clearPopover();
    void setAnchorId(QString anchorId);
    void setGifts(QString giftId, QString giftName);
    void set_Uuid(QString Uuid);
    void quit_game();
    void out_cache();
    QMap<QString, QString> get_users();

public slots:
    QString append_user(const int& code, const TiktokGiftInfo &giftInfo);
    void on_send_codes();
    QJsonArray fill_robot(const QJsonArray& array);

    void game(const QJsonArray& array);
    void start_game();
    void rebot_game();
    void additem(QString playerId, QString team, QString content, int progress = -1, QString prefix = "", int customAvatarIndex = 0); // customAvatarIndex自定义头像序号，这个参数为缺省值，为其他值就对应服务器头像序号, -1 为不用进度条
    void delitem(QString playerId);
    void killBroadcast(const QString killerId, const QString victimId, const int killVoice = -1); // 击杀播报
    void clearKillBroadcast();

signals:
    void handle_cache(const QString& str);
    void on_reboot_game();
    void send_codes_success();
    void send_codes_fail(const QString& errInfo);
    void player_join(const QString &user_nickname, const QString& user_id);
    void show_win(const QString& player_name, const QString& player_HeadImgUrl, const QString& team, const QString& content);
    void show_gift(const QString& player_name, const QString& player_HeadImgUrl, const QString& team, const QString& content); // 显示礼物
    void add_item(QString playerId, QString playerName, QString HeadImgUrl, QString team, QString content, int progress, QString prefix);
    void del_item(QString playerId, QString playerName);
    void clear_UI();
    void clear_Popover();
    void on_quit_game();
    void chang_playerSort(const QString& userId, const QString& sortValue);// 改变玩家排序
    void openLeaderboard_cs();  // 打开 cs 排行榜
    void showLeaderboard_cs(const int &team, const QVector<QString> &playerNames);  // 显示 cs 排行榜, team == 0 显示红方排行榜，playerNames 玩家名
    void show_killBroadcast(const Player killerId, const Player victimId, const int killVoice);
    void clear_killBroadcast();

private:
    QMap<QString, QString> m_users;             // 用户池，< 用户名， 用户 Id > Id为加入后人数 + 1
    QMap<QString, QString> m_user_HeadImgUrl;   // 用户头像
    QMap<QString, QString> m_gifts;             // 当前游戏礼物配置
    bool m_game_switch;                         // 游戏开关
    bool m_steam_swith;                         // 数据流向开关, true 流向主数组，false 流向备用数组
    QNetworkReply *m_reply;                     // 接收返回的数据，网络应答对象
    QJsonArray m_codeArray;                     // 处理完的弹幕数字存在这个数组里
    QJsonArray m_standby_codeArray;             // 备用弹幕数组
    QNetworkAccessManager* m_manager;
    QString m_anchorId;                         // 主播ID
    QString m_Uuid;                             // 本局ID
    QTimer *m_timer_game;                       // 处理user_code定时器
};

#endif // GAMESESSION_H
